/**
 * @author xinjie.txt
 * @time: 2020年7月2日 上午12:07:14
 */
package com.jiepu.daily.corejava.day0702.sort;

import java.util.Arrays;
import java.util.Scanner;

/**
 * @Description: b）冒泡排序: 在要排序的一组数中，对当前还未排好序的 范围内的全部数，自上而下对相邻的两个数 依次进行比较和调整，
 *               让较大的数往下沉，较小的往上冒。 即：每当两相邻的数比较后发现它们的排序 与排序要求相反时，就将它们互换。
 *               Bubble.java
 * @author xinjie.txt
 */
public class Bubble {

	/**
	 * @Description:
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		// init array[]
		Scanner scanner = new Scanner(System.in);
		System.out.println("Input len OfDouble Array[]: ");
		// len -- array[] 长度
		int len = scanner.nextInt();
		int[] array = new int[len];
		InputArray(array, len);

		System.out.println("排序前结果： ");
		PrintArray(array);

		/*
		 * for (int i = 0; i < n; i++) {
		 * 
		 * System.out.print(array[i] + " "); }
		 */
		// 最后一次交换 的元素位置
		int lastIndex = array.length-1;

		// array.length-1 趟排序
		for (int i = 0; i < len - 1; i++) {
			// 标记本趟循环是否交换
			boolean change = false;

			int count = lastIndex;

			// for (int j = 0; j < len - 1 - i; j++) {
			for (int j = 0; j < count; j++) {

				if (array[j] > array[j + 1]) {

					swap(array, j, j + 1);
					// 记录 当前循环 最后交换的一位
					lastIndex = j;
					// 标记本次循环 交换发生
					change = true;
				} // fi
			}
			// 当前趟 未发生元素交换， 则数组有序
			if (!change) {
				break;
			}

		}

		System.out.println();
		System.out.println("排序后结果： ");
		PrintArray(array);

	}

	public static void PrintArray(int[] array) {
		System.out.println(Arrays.toString(array));
	} // PrintArray

	public static void swap(int[] array, int m, int n) {
		int temp = 0;
		temp = array[m];
		array[m] = array[n];
		array[n] = temp;

	}

	public static void InputArray(int[] array, int len) {
		// Scanner scanner = new Scanner(System.in);
		System.out.println("Input Array[]:");
		Scanner input = new Scanner(System.in);
		for (int i = 0; i < len; i++) {
			System.out.println("Input the array[" + i + "] numner: ");
			array[i] = input.nextInt();

		}
	}

}
